// #include <iostream>
// #include <algorithm>
// using namespace std;

// template <class T>
// T Add(const T& left,const T& right)
// {
//     return left + right;
// }

// template <class T1, class T2>
// T2 Add(const T1& left, const T2& right)
// {
//     return left + right;
// }

// // int main()
// // {
// //     int a = 10, b = 20;
// //     double c = 10.1, d = 20.2;
// //     cout << Add(a, b) << endl;
// //     //强制类型转换 推导实例化
// //     cout << Add(a, (int)c) << endl;
// //     cout << Add((double)a, c) << endl;

// //     //显示实例化
// //     cout << Add<int>(a, c) << endl;
// //     cout << Add<double>(a, c) << endl;

// //     cout << Add(a, c) << endl;

// //     return 0;
// // }

// template <class T>
// class Stack
// {
// public:
//     Stack(int n = 4)
//         :_array(new T[n])
//         ,_size(0)
//         ,_capacity(n)
//     {}

//     ~Stack()
//     {
//         delete[] _array;
//         _array = nullptr;
//         _size = _capacity = 0;
//     }

//     void Push(const T& x)
//     {
//         if(_size == _capacity)
//         {
//             T* tmp = new T[_capacity * 2];
//             memcpy(tmp, _array, sizeof(T) * _size);
//             delete[] _array;

//             _array = tmp;
//             _capacity *= 2;
//         }
//         _array[_size++] = x;
//     }

//     void Print()
//     {
//         for(size_t i = 0; i < _size; i++)
//         {
//             cout << _array[i] << " ";
//         }
//         cout << endl;
//     }

//     void Pop()
//     {
//         --_size;
//     }

// private:
//     T* _array;
//     size_t _size;
//     size_t _capacity;
// };

// int main()
// {
//     //类模板都是显式实例化
//     Stack<int> st;
//     st.Push(1);
//     st.Push(2);
//     st.Push(3);
//     st.Push(4);
//     st.Print();

//     st.Pop();
//     st.Print();

// }

// template <class T>
// T Func(int n)
// {
//     return new T[n];
// }

// int main()
// {
//     double* p1 = Func<double>(10);
// }